// 引用
import { MessageBox } from 'element-ui';
// 通用工具类
;
(function(global, undefined) {
  "use strict"; //使用js严格模式检查，使语法更规范
  let _global;
  let tools = {
    // 登录token的type对应的登录入口
    loginTypeMap:{
    },
    // ---------------------------  共通用部分  ---------------------------
    // 转为金额
    toMoney:function(s){
        if(/[^0-9\.]/.test(s)) return 0;
        s=String(s);
        s=s.replace(/^(\d*)$/,"$1.");
        s=(s+"00").replace(/(\d*\.\d\d)\d*/,"$1");
        s=s.replace(".",",");
        var re=/(\d)(\d{3},)/;
        while(re.test(s))
          s=s.replace(re,"$1,$2");
        s=s.replace(/,(\d\d)$/,".$1");
        return s.replace(/^\./,"0.")
    },
    // 转为数字
    toNumber: function (number, digit) {
      if (!number || isNaN(parseFloat(number))) return parseFloat("0").toFixed(digit);
      number = parseFloat(number);
      if (digit) number = parseFloat(number).toFixed(digit);
      if (0 > number) number = 0 - number;
      return number;
    },
    // 检测工具
    check: function(bol, error) {
      // 结果判定正常，继续执行
      if (!!(bol) === true) return;
      // 判定error类型，执行判断错误时的处理
      if (error) {
        if (typeof error === "function") {
          error();
        }
        if (typeof error === "string") {
          // 提示信息
          MessageBox.alert(error, '提示', {
            confirmButtonText: '确定',
            callback: action => {
              console.log(error)
            }
          });
        }
      }
      // 处理终端
      throw new MyBreakError();
    },
    // 检测工具处理区域(返回是否发送错误)
    checkBody: function(fun) {
      try {
        fun();
      } catch (err) {
        if(err.name === "MyBreakError"){
          return true;
        }else{
          throw err;
        }
      }
      return false;
    },
    // 数字前补0
    prefixInteger:function(num, n) {
      if(!n) n = 2;
      return (Array(n).join(0) + num).slice(-n);
    },
    // 计时数据显示
    toTimekeeperShow: function (time, hour, min, sec) {
      let myTime = Math.floor(time / 1000);
      let mySec = myTime % 60; // 时
      let myMin = Math.floor(myTime % 3600 / 60); // 分
      let myHour = Math.floor(myTime / 3600); // 秒
      return myHour + (hour?hour:":") + myMin + (min?min:":") + mySec + (sec?sec:"");
    },
    toTimekeeper: function (time, hour, min, sec) {
      let myTime = Math.floor(time / 1000);
      let mySec = myTime % 60; // 时
      let myMin = Math.floor(myTime % 3600 / 60); // 分
      let myHour = Math.floor(myTime / 3600); // 秒
      return tools.prefixInteger(myHour) + (hour?hour:":") + tools.prefixInteger(myMin) + (min?min:":") + tools.prefixInteger(mySec) + (sec?sec:"");
    },
    // 获取cookie
    getCookie:function(name) {
      var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
      if (arr = document.cookie.match(reg))
        return (arr[2]);
      else
        return null;
    },
    // 设置cookie,增加到vue实例方便全局调用
    setCookie:function(c_name, value, expiredays) {
      var exdate = new Date();
      exdate.setDate(exdate.getDate() + expiredays);
      document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
    },
    // 删除cookie
    delCookie:function(name) {
      var exp = new Date();
      exp.setTime(exp.getTime() - 1);
      var cval = getCookie(name);
      if (cval != null)
      document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
    },
    // 深层合并
    mergeObject:function(firstObj, secondObj) { // 深度合并对象
      for (var key in secondObj) {
          firstObj[key] = firstObj[key] && firstObj[key].toString() === "[object Object]" ? this.mergeObject(firstObj[key], secondObj[key]) : firstObj[key] = secondObj[key];
      }
      return firstObj;
    },
    // 判断是否是url
    isExternalUrl:function(path) {
      return /^(https?:|mailto:|tel:)/.test(path)
    }
  };
  // 最后将插件对象暴露给全局对象
  _global = (function() {
    return this || (0, eval)('this');
  }());
  !('tools' in _global) && (_global.tools = tools);
}());


// --- 对Date的扩展 ---
// 将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
// 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子：
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
Date.prototype.format = function(fmt) { //author: meizz
  let o = {
    "M+": this.getMonth() + 1, //月份
    "d+": this.getDate(), //日
    "h+": this.getHours(), //小时
    "m+": this.getMinutes(), //分
    "s+": this.getSeconds(), //秒
    "q+": Math.floor((this.getMonth() + 3) / 3), //季度
    "S": this.getMilliseconds() //毫秒
  };
  if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  for (let k in o)
    if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  return fmt;
}
// 在当前时间上添加年数
Date.prototype.addYear = function(years) {
  let cyear = this.getFullYear();
  cyear += years;
  this.setYear(cyear);
  return this;
}
// 在当前时间上添加天数
Date.prototype.addDay = function(days) {
  let cd = this.getDate();
  cd += days;
  this.setDate(cd);
  return this;
}
// 在当前时间上添加月数
Date.prototype.addMonth = function(months) {
  let cm = this.getMonth();
  cm += months;
  this.setMonth(cm);
  return this;
}
// 在当前时间上添加小时
Date.prototype.addHour = function(hours) {
  let cm = this.getHours();
  cm += hours;
  this.setHours(cm);
  return this;
}

/////////////////////////////////////////////////////////
// 自定义异常，用于处理中断跳出
/////////////////////////////////////////////////////////
function MyBreakError(message) {
  this.name = 'MyBreakError';
  this.message = message || '处理中断';
  this.stack = (new Error()).stack;
}
MyBreakError.prototype = Object.create(Error.prototype);
MyBreakError.prototype.constructor = MyBreakError;
